import json
import time
import hmac
import hashlib
import base64
import urllib.parse
import requests
from datetime import datetime, date
from django.conf import settings
from django.utils import timezone


def send_dingtalk_message(message, at_mobiles=None, is_at_all=False):
    """
    发送钉钉消息
    :param message: 消息内容
    :param at_mobiles: 需要@的手机号列表
    :param is_at_all: 是否@所有人
    :return: 发送结果
    """
    if not settings.DINGTALK_ENABLED:
        return {'errcode': -1, 'errmsg': 'DingTalk notification is disabled'}

    webhook_url = settings.DINGTALK_WEBHOOK

    # 如果设置了加签密钥，计算签名
    if hasattr(settings, 'DINGTALK_SECRET') and settings.DINGTALK_SECRET:
        timestamp = str(round(time.time() * 1000))
        secret = settings.DINGTALK_SECRET
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(timestamp, secret)
        string_to_sign_enc = string_to_sign.encode('utf-8')
        hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
        sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
        webhook_url = f"{webhook_url}&timestamp={timestamp}&sign={sign}"

    # 构建请求数据
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": "任务管理系统通知",
            "text": message
        },
        "at": {
            "atMobiles": at_mobiles if at_mobiles else [],
            "isAtAll": is_at_all
        }
    }

    # 发送请求
    headers = {'Content-Type': 'application/json; charset=utf-8'}
    try:
        response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
        return response.json()
    except Exception as e:
        return {'errcode': -1, 'errmsg': str(e)}


def check_due_tasks():
    """
    检查今天到期的任务并发送钉钉通知
    """
    from .models import Task  # 避免循环导入

    today = date.today()
    # 查找今天到期且状态不是已完成的任务
    due_tasks = Task.objects.filter(due_date=today).exclude(status='done')

    if not due_tasks:
        return {'errcode': 0, 'errmsg': '没有任务到期'}

    # 构建通知消息
    message = "### 📅 今日到期任务提醒 \n\n"
    message += f"截至 {today.strftime('%Y-%m-%d')}，以下任务即将到期，请及时处理：\n\n"

    for task in due_tasks:
        # 获取任务详情URL
        task_url = f"{settings.SITE_URL}task/{task.id}/" if hasattr(settings, 'SITE_URL') else ""

        # 添加任务信息
        message += f"#### [{task.title}]({task_url}) \n"
        message += f"- **项目**: {task.Projectname or '未指定'} \n"
        message += f"- **系统**: {task.system or '未指定'} \n"
        message += f"- **状态**: {'待办' if task.status == 'todo' else '进行中'} \n"

        # 添加负责人信息
        if task.assigned_to:
            message += f"- **负责人**: {task.assigned_to.username} \n"
        else:
            message += f"- **负责人**: 未分配 \n"

        # 添加项目经理和测试负责人
        if task.ProjectManager:
            message += f"- **项目经理**: {task.ProjectManager} \n"
        if task.TestEngineer:
            message += f"- **测试负责人**: {task.TestEngineer} \n"

        # 添加进度信息
        message += f"- **测试进度**: {task.testprogress}% \n"
        message += f"- **截止日期**: {task.due_date.strftime('%Y-%m-%d')} \n\n"

    # 添加提醒信息
    message += "> 请相关负责人及时处理以上任务，避免延期！\n"

    # 发送钉钉通知
    result = send_dingtalk_message(message, is_at_all=True)

    return result


def order_dinner():
    url = "https://www.yongshantuan.cn/#/pages/order?id=410622"
    message = "### 福利晚餐🍲（亚飞）\n\n"
    message += f"#### 下单需知: \n"
    message += f"- **下单流程**: 打开选择菜品>挑选自己的菜品>输入对应个人信息>19点之前送到根据自己的序号取餐 \n"
    message += f"- **下单时间**: 📅22：00-16：10 \n"
    message += f"- **提醒**: 每位伙伴限点一份晚餐，请勿使用其他伙伴的信息点餐，下单需要填写正确的员工姓名全称。（中文名全名/钉钉英文名） \n"
    message += f"- **提醒**: 如取餐找不到餐，请联系梦姐-配送电话📱137-1473-0053；遇到餐品异物、变味、破漏等质量原因，请到取餐处找送餐人员处理售后，并告知行政人员👨🏻‍⚖️-冼淑怡/陈晓航 \n"
    message += f"- **点餐链接**: 🔗[https://www.yongshantuan.cn/#/pages/order?id=410622](%s) \n" % url

    result = send_dingtalk_message(message, is_at_all=True)
    return result
